/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} left
 * @param {number} right
 * @return {ListNode}
 * @description myself
 */
 var reverseBetween = function(head, left, right) {
    let dummy = new ListNode()
    dummy.next = head
    // 三剑客
    let pre = null
    let cur = dummy
    let next = null
    // 反转后 部分链表 的尾的前驱结点
    let start = null
    // 反转后 部分链表 的尾结点
    let end = null
    // 需要翻转的 部分链表的长度
    let len = right - left
    // 让cur到 需要翻转链表的第一个元素
    while (left > 0) {
        // 记录反转数组的尾部 的前驱结点
        start = cur
        cur = cur.next
        left--
    }
    // 记录反转数组的尾部
    end = cur
    while (len >= 0 && cur) {
        next = cur.next
        cur.next = pre
        pre = cur
        cur = next
        len--
    }
    start.next = pre
    end.next= next
    return dummy.next
};